use winreg::RegKey;
use winreg::enums::*;
use std::collections::LinkedList;
use serde::Serialize;
use serde_json;
use std::process::Command;
#[derive(Debug, Serialize)]
pub struct SoftwareInfo {
    pub soft_name: String,   // 软件名称
    pub soft_version: String, // 软件版本
    pub publisher: String,    // 软件发布者
    pub system_id: String,    // 系统ID
}

// 获取已安装的软件信息
pub fn get_installed_software() -> LinkedList<SoftwareInfo> {
    let mut softwares: LinkedList<SoftwareInfo> = LinkedList::new();

    // 获取系统ID
    let system_id = get_system_id();

    // 注册表路径列表
    let paths = [
        r"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall",
        r"SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall",
    ];

    for path in paths.iter() {
        // 打开HKEY_LOCAL_MACHINE注册表根键
        let hklm = RegKey::predef(HKEY_LOCAL_MACHINE);
        // 打开指定的注册表路径
        if let Ok(subkey) = hklm.open_subkey(path) {
            // 遍历所有子键（每个子键通常表示一个软件）
            for subkey_name in subkey.enum_keys().map(|x| x.unwrap()) {
                if let Ok(subkey) = subkey.open_subkey(subkey_name) {
                    // 读取显示名称和版本
                    let display_name: Result<String, _> = subkey.get_value("DisplayName");
                    let display_version: Result<String, _> = subkey.get_value("DisplayVersion");
                    let publisher_company = subkey.get_value("Publisher").unwrap_or_default();

                    if let (Ok(name), Ok(version)) = (display_name, display_version) {
                        // 排除Microsoft公司的软件
                        if publisher_company != "Microsoft" && publisher_company != "Microsoft Corporation" {
                            // 将软件名称、版本、发布者和系统ID添加到LinkedList中
                            softwares.push_back(SoftwareInfo{
                                soft_name: name,
                                soft_version: version,
                                publisher: publisher_company,
                                system_id: system_id.clone(),
                            });
                        }
                    }
                }
            }
        }
    }

    softwares
}
fn get_system_id() -> String {
    let output = Command::new("wmic")
        .arg("csproduct")
        .arg("get")
        .arg("UUID")
        .output()
        .expect("Failed to execute wmic command");

    let output_str = String::from_utf8_lossy(&output.stdout);
    output_str
        .lines()
        .skip(1) // 跳过第一行（标题）
        .filter(|&line| !line.trim().is_empty()) // 过滤空行
        .next()
        .unwrap_or("Unknown")
        .trim()
        .to_string()
}
